package com.sentrix.auto.printercenter.infrastructure.util;

import cn.hutool.core.util.StrUtil;
import org.apache.commons.lang3.StringUtils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PrintUtil {

    // taskId涉及到的模板（格式：_TASK{taskId}_）
    private static final String TASKID_TEMPLATE = "_TASK{}_";

    // 正则表达式：匹配_TASK[唯一标识]_（捕获唯一标识部分，忽略大小写？根据业务需求调整，这里严格匹配大写TASK）
    private static final Pattern TASK_PATTERN = Pattern.compile("_TASK([^_]+)_");

    // JobName最大长度（兼容255字符限制）
    private static final int MAX_JOB_NAME_LENGTH = 255;

    /**
     * 从printJobName中提取taskId
     *
     * @param jobName 打印任务的JobName
     * @return 提取的taskId（如taskId为123，则返回"123"）
     * @throws RuntimeException 若jobName为空或未找到taskId
     */
    public static String extractTaskId(String jobName) {
        if (StringUtils.isBlank(jobName)) {
            throw new RuntimeException("jobName can't be null");
        }

        // 匹配_TASKxxx_格式，提取xxx部分
        Matcher matcher = TASK_PATTERN.matcher(jobName);
        if (matcher.find()) {
            // 分组1为_TASK和_之间的唯一标识（即taskId）
            return matcher.group(1);
        } else {
            throw new RuntimeException("taskId not found in jobName: " + jobName);
        }
    }

    /**
     * 将taskId封装到jobName中（格式：原jobName + _TASK{taskId}_）
     *
     * @param jobName 原始jobName
     * @param taskId  需封装的taskId
     * @return 封装后的完整jobName
     * @throws RuntimeException 若jobName或taskId为空
     */
    public static String wrapTaskId(String jobName, String taskId) {
        if (StringUtils.isBlank(jobName)) {
            throw new RuntimeException("jobName can't be null");
        }
        if (StringUtils.isBlank(taskId)) {
            throw new RuntimeException("taskId can't be null");
        }
        // 校验taskId中是否包含下划线（避免干扰解析）
        if (taskId.contains("_")) {
            throw new RuntimeException("taskId can't contain '_'");
        }

        // 生成taskId标识部分（如_TASK123_）
        String taskIdStr = StrUtil.format(TASKID_TEMPLATE, taskId);
        // 拼接原始jobName和taskId标识
        String rawJobName = jobName + taskIdStr;

        // 控制总长度不超过255字符（优先保留taskId部分，截断原始jobName）
        if (rawJobName.length() > MAX_JOB_NAME_LENGTH) {
            // 计算需要截断的长度（总长度 - 最大允许长度）
            int truncateLength = rawJobName.length() - MAX_JOB_NAME_LENGTH;
            // 截断原始jobName的前面部分，确保taskIdStr完整保留
            rawJobName = rawJobName.substring(truncateLength);
        }

        return rawJobName;
    }

}